﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos.Clases;
using Biciq.Datos;
using System.Collections.Generic;
using System.ServiceModel.DomainServices.Client.ApplicationServices;
using System.Linq;
namespace Biciq.Silverlight.UI
{
    public class LoginVistaModelo:VistaModeloBase
    {

        #region campos
        private DatosLogin _datosLogin;
        private Result _resultadoLogin;
        #endregion

        #region propiedades

       
        /// <summary>
        /// Guarada el resultado de la operación de Login
        /// </summary>
        public Result ResultadoLogin
        {
            get { return _resultadoLogin; }
            set
            {
                _resultadoLogin = value;
                RaisePropertyChanged("ResultadoLogin");
            }
        }

        /// <summary>
        /// Datos para Ingreso en el sistema
        /// </summary>
        public DatosLogin DatosLogin
        {
            get { return _datosLogin; }
            set
            {
                _datosLogin = value;
                RaisePropertyChanged("DatosLogin");
            }
        }

        /// <summary>
        /// Instancia del comando para crear ingresar al Sistema
        /// </summary>
        public RelayCommand ComandoAceptar
        {
            get
            {
                if (_comandoAceptar == null)
                {
                    _comandoAceptar = new RelayCommand
                    (
                        p => Aceptar()
                    );
                }
                return _comandoAceptar;
            }
        }

        /// <summary>
        /// Instancia del comando para crear ingresar al Sistema
        /// </summary>
        public RelayCommand ComandoCancelar
        {
            get
            {
                if (_comandoCancelar == null)
                {
                    _comandoCancelar = new RelayCommand
                    (
                        p => Cancelar()
                    );
                }
                return _comandoCancelar;
            }
        }

        

        #endregion

        #region comandos
        private RelayCommand _comandoCancelar;
        private RelayCommand _comandoAceptar;
        private RelayCommand _comandoOlvidoClave;
        #endregion

        #region metodos privados
        /// <summary>
        /// Metodo que implementa la funcionalidad del boton aceptar. Login de Usuario
        /// </summary>
        private void Aceptar()
        {
            Procesando = true;
            InicializarMensajesError();
            if (DatosLogin.Usuario == null || DatosLogin.Clave == null)
            {
                DatosLogin.Usuario = "";
                DatosLogin.Clave = "";
            }
            if (DatosLogin.HasValidationErrors)
            {
                Procesando = false;
                return;
            }
           

            //AutenticacionServicio.Load(AutenticacionServicio.LoginQuery(_datosLogin.Usuario,_datosLogin.Clave, true, string.Empty), RegistroLoginViertualCompleto, null);
            LoginOperation loginOp = WebContext.Current.Authentication.Login(_datosLogin.Usuario, _datosLogin.Clave);
            loginOp.Completed += (s2, e2) =>
            {
                
                if (loginOp.LoginSuccess)
                {

                    TraerUsuario();
                }
                else
                {
                    Procesando = false;
                    IsDirty = false;
                    AgregarMensajeError("Usuario o Password Incorrectos, intente nuevamente");
                    MostrarErrores = Visibility.Visible;
                }

            };


        }

        private void TraerUsuario()
        {
            SeguridadesContexto.Usuarios.Clear();
            SeguridadesContexto.Load(SeguridadesContexto.ObtenerUsuarioPorNombreQuery(DatosLogin.Usuario)).Completed += delegate
            {
                
                CacheCliente.UsuarioLogueado = SeguridadesContexto.Usuarios.FirstOrDefault();
                
                IsDirty = true;
                Procesando = false;
                CerrarVentana();
            };
        }
  

        /// <summary>
        /// Cancelar el Login
        /// </summary>
        private void Cancelar()
        {
            CerrarVentana();
        }

        /// <summary>
        /// Cerrr la Ventana
        /// </summary>
        private void CerrarVentana()
        {
            //pregunto si alguien se suscribio al evento
            if (EventoCerrarLogin != null)
            {
                EventoCerrarLogin(null, null);
            }
        }


        #endregion

        #region constructores
        /// <summary>
        /// Constructor de la Clase.
        /// </summary>
        public LoginVistaModelo()
        {
            _datosLogin = new DatosLogin();
            InicializarMensajesError();
        }
        #endregion

        #region eventos
        public EventHandler EventoCerrarLogin;

        #endregion

    }
}
